package org.yelongframework.excel.workbook;

import java.io.IOException;
import java.io.OutputStream;
import java.util.List;

import org.yelongframework.excel.sheet.ExcelSheet;
import org.yelongframework.lang.Nullable;

/**
 * Excel工作薄
 * 
 * @since 1.0.0
 */
public interface ExcelWorkbook {

	// ==================================================工作表数量==================================================

	/**
	 * @return Sheet数量
	 */
	int getSheetNum();

	// ==================================================创建工作表==================================================

	/**
	 * 创建一个Sheet
	 * 
	 * @param sheetName Sheet名称
	 * @return Sheet
	 */
	ExcelSheet createSheet(String sheetName);

	// ==================================================获取工作表==================================================

	/**
	 * @param index 索引
	 * @return 指定索引的Sheet
	 */
	@Nullable
	ExcelSheet getSheet(int index);

	/**
	 * @return 第一个Sheet
	 */
	@Nullable
	ExcelSheet getFirstSheet();

	/**
	 * @return 所有的Sheet
	 */
	List<ExcelSheet> getSheetList();

	// ==================================================获取工作表索引==================================================

	/**
	 * 获取Sheet的索引
	 * 
	 * @param sheet Sheet
	 * @return 索引
	 */
	int getSheetIndex(ExcelSheet sheet);

	// ==================================================复制工作表==================================================

	/**
	 * 复制sheet页
	 * 
	 * @param workbook  工作薄
	 * @param srcSheet  源sheet索引
	 * @param destSheet 目标sheet索引
	 */
	void copySheet(int srcSheetIndex, int destSheetIndex);

	/**
	 * 复制sheet页
	 * 
	 * @param workbook  工作薄
	 * @param srcSheet  源sheet
	 * @param destSheet 目标sheet
	 */
	void copySheet(ExcelSheet srcSheet, ExcelSheet destSheet);

	// ==================================================写入到流中==================================================

	/**
	 * 将Excel内容写到流中
	 * 
	 * @param outputStream 输出流
	 * @throws IOException 流异常
	 */
	void write(OutputStream outputStream) throws IOException;

	// ==================================================工作薄==================================================

	/**
	 * @return Excel工作薄
	 */
	Object getWorkbook();

}
